home *** CD-ROM | disk | FTP | other *** search
/ Aminet 19 / Aminet 19 (1997)(GTI - Schatztruhe)[!][Jun 1997].iso / Aminet / dev / mui / MUIPlusPlus.lha / Source / MainHeader / HeaderStart < prev    next >
Encoding:
Text File  |  1997-03-13  |  15.3 KB  |  405 lines

  1. #ifndef LIBRARIES_MUI_HPP
  2. #define LIBRARIES_MUI_HPP
  3.  
  4. // Many MUI shortcuts are incompatiable with this header as they have the
  5. // same name as member functions in classes. For this reason they cannot
  6. // be included. Instead, the shortcuts which are compatiable are redefined
  7. // later in this header file.
  8.  
  9. #ifndef MUI_NOSHORTCUTS
  10. #define MUI_NOSHORTCUTS
  11. #endif
  12.  
  13. #ifndef LIBRARIES_MUI_H
  14. #include <libraries/mui.h>
  15. #endif
  16.  
  17. // Include prototypes for MUI and BOOPSI function calls
  18.  
  19. #ifdef __GNUC__
  20. #include <inline/muimaster.h>
  21. #include <inline/intuition.h>
  22. #else
  23. #include <clib/muimaster_protos.h>
  24. #include <clib/intuition_protos.h>
  25. #endif
  26.  
  27. #include <clib/alib_protos.h>
  28.  
  29. // Shortcuts that are compatiable with this header are redefined here.
  30. // The standard MUI <class>Object shortcuts for creating objects
  31. // (eg. WindowObject etc) have been redefined as <class>Obj
  32. // (eg. WindowObj) so as not to conflict with member functions of the
  33. // same name within classes.
  34.  
  35. #ifndef MUIPP_NOSHORTCUTS
  36.  
  37. #define MenustripObj         MUI_NewObject(MUIC_Menustrip
  38. #define MenuObj              MUI_NewObject(MUIC_Menu
  39. #define MenuObjT(name)       MUI_NewObject(MUIC_Menu,MUIA_Menu_Title,name
  40. #define MenuitemObj          MUI_NewObject(MUIC_Menuitem
  41. #define WindowObj            MUI_NewObject(MUIC_Window
  42. #define ImageObj             MUI_NewObject(MUIC_Image
  43. #define BitmapObj            MUI_NewObject(MUIC_Bitmap
  44. #define BodychunkObj         MUI_NewObject(MUIC_Bodychunk
  45. #define NotifyObj            MUI_NewObject(MUIC_Notify
  46. #define ApplicationObj       MUI_NewObject(MUIC_Application
  47. #define TextObj              MUI_NewObject(MUIC_Text
  48. #define RectangleObj         MUI_NewObject(MUIC_Rectangle
  49. #define BalanceObj           MUI_NewObject(MUIC_Balance
  50. #define ListObj              MUI_NewObject(MUIC_List
  51. #define PropObj              MUI_NewObject(MUIC_Prop
  52. #define StringObj            MUI_NewObject(MUIC_String
  53. #define ScrollbarObj         MUI_NewObject(MUIC_Scrollbar
  54. #define ListviewObj          MUI_NewObject(MUIC_Listview
  55. #define RadioObj             MUI_NewObject(MUIC_Radio
  56. #define VolumelistObj        MUI_NewObject(MUIC_Volumelist
  57. #define FloattextObj         MUI_NewObject(MUIC_Floattext
  58. #define DirlistObj           MUI_NewObject(MUIC_Dirlist
  59. #define CycleObj             MUI_NewObject(MUIC_Cycle
  60. #define GaugeObj             MUI_NewObject(MUIC_Gauge
  61. #define ScaleObj             MUI_NewObject(MUIC_Scale
  62. #define NumericObj           MUI_NewObject(MUIC_Numeric
  63. #define SliderObj            MUI_NewObject(MUIC_Slider
  64. #define NumericbuttonObj     MUI_NewObject(MUIC_Numericbutton
  65. #define KnobObj              MUI_NewObject(MUIC_Knob
  66. #define LevelmeterObj        MUI_NewObject(MUIC_Levelmeter
  67. #define BoopsiObj            MUI_NewObject(MUIC_Boopsi
  68. #define ColorfieldObj        MUI_NewObject(MUIC_Colorfield
  69. #define PenadjustObj         MUI_NewObject(MUIC_Penadjust
  70. #define ColoradjustObj       MUI_NewObject(MUIC_Coloradjust
  71. #define PaletteObj           MUI_NewObject(MUIC_Palette
  72. #define GroupObj             MUI_NewObject(MUIC_Group
  73. #define RegisterObj          MUI_NewObject(MUIC_Register
  74. #define VirtgroupObj         MUI_NewObject(MUIC_Virtgroup
  75. #define ScrollgroupObj       MUI_NewObject(MUIC_Scrollgroup
  76. #define PopstringObj         MUI_NewObject(MUIC_Popstring
  77. #define PopObjObj             MUI_NewObject(MUIC_Popobject
  78. #define PoplistObj           MUI_NewObject(MUIC_Poplist
  79. #define PopaslObj            MUI_NewObject(MUIC_Popasl
  80. #define PendisplayObj        MUI_NewObject(MUIC_Pendisplay
  81. #define PoppenObj            MUI_NewObject(MUIC_Poppen
  82. #define AboutmuiObj          MUI_NewObject(MUIC_Aboutmui
  83. #define ScrmodelistObj       MUI_NewObject(MUIC_Scrmodelist
  84. #define KeyentryObj          MUI_NewObject(MUIC_Keyentry
  85. #define VGroup              MUI_NewObject(MUIC_Group
  86. #define HGroup              MUI_NewObject(MUIC_Group,MUIA_Group_Horiz,TRUE
  87. #define ColGroup(cols)      MUI_NewObject(MUIC_Group,MUIA_Group_Columns,(cols)
  88. #define RowGroup(rows)      MUI_NewObject(MUIC_Group,MUIA_Group_Rows   ,(rows)
  89. #define PageGroup           MUI_NewObject(MUIC_Group,MUIA_Group_PageMode,TRUE
  90. #define VGroupV             MUI_NewObject(MUIC_Virtgroup
  91. #define HGroupV             MUI_NewObject(MUIC_Virtgroup,MUIA_Group_Horiz,TRUE
  92. #define ColGroupV(cols)     MUI_NewObject(MUIC_Virtgroup,MUIA_Group_Columns,(cols)
  93. #define RowGroupV(rows)     MUI_NewObject(MUIC_Virtgroup,MUIA_Group_Rows   ,(rows)
  94. #define PageGroupV          MUI_NewObject(MUIC_Virtgroup,MUIA_Group_PageMode,TRUE
  95. #define RegisterGroup(t)    MUI_NewObject(MUIC_Register,MUIA_Register_Titles,(t)
  96. #define End                 TAG_DONE)
  97.  
  98. #define Child                 MUIA_Group_Child
  99. #define FChild                MUIA_Family_Child
  100. #define SubWindow             MUIA_Application_Window
  101. #define WindowContents        MUIA_Window_RootObject
  102. #define CMUI_VGroup            CMUI_Group
  103.  
  104. // Frame types
  105.  
  106. #define NoFrame          MUIA_Frame, MUIV_Frame_None
  107. #define ButtonFrame      MUIA_Frame, MUIV_Frame_Button
  108. #define ImageButtonFrame MUIA_Frame, MUIV_Frame_ImageButton
  109. #define TextFrame        MUIA_Frame, MUIV_Frame_Text
  110. #define StringFrame      MUIA_Frame, MUIV_Frame_String
  111. #define ReadListFrame    MUIA_Frame, MUIV_Frame_ReadList
  112. #define InputListFrame   MUIA_Frame, MUIV_Frame_InputList
  113. #define PropFrame        MUIA_Frame, MUIV_Frame_Prop
  114. #define SliderFrame      MUIA_Frame, MUIV_Frame_Slider
  115. #define GaugeFrame       MUIA_Frame, MUIV_Frame_Gauge
  116. #define VirtualFrame     MUIA_Frame, MUIV_Frame_Virtual
  117. #define GroupFrame       MUIA_Frame, MUIV_Frame_Group
  118. #define GroupFrameT(s)   MUIA_Frame, MUIV_Frame_Group, MUIA_FrameTitle, s, MUIA_Background, MUII_GroupBack
  119.  
  120. // Spacing objects
  121.  
  122. #define HVSpace           MUI_NewObject(MUIC_Rectangle,TAG_DONE)
  123. #define HSpace(x)         MUI_MakeObject(MUIO_HSpace,x)
  124. #define VSpace(x)         MUI_MakeObject(MUIO_VSpace,x)
  125. #define HCenter(obj)      (HGroup, GroupSpacing(0), Child, HSpace(0), Child, (obj), Child, HSpace(0), End)
  126. #define VCenter(obj)      (VGroup, GroupSpacing(0), Child, VSpace(0), Child, (obj), Child, VSpace(0), End)
  127. #define InnerSpacing(h,v) MUIA_InnerLeft,(h),MUIA_InnerRight,(h),MUIA_InnerTop,(v),MUIA_InnerBottom,(v)
  128. #define GroupSpacing(x)   MUIA_Group_Spacing,x
  129.  
  130. // Labelling objects. The standard Label shortcut has been redefined as RLabel
  131. // because some classes have an attribute called "Label".
  132.  
  133. #define RLabel(label)  MUI_MakeObject(MUIO_Label,label,0)
  134. #define RLabel1(label) MUI_MakeObject(MUIO_Label,label,MUIO_Label_SingleFrame)
  135. #define RLabel2(label) MUI_MakeObject(MUIO_Label,label,MUIO_Label_DoubleFrame)
  136. #define LLabel(label)  MUI_MakeObject(MUIO_Label,label,MUIO_Label_LeftAligned)
  137. #define LLabel1(label) MUI_MakeObject(MUIO_Label,label,MUIO_Label_LeftAligned|MUIO_Label_SingleFrame)
  138. #define LLabel2(label) MUI_MakeObject(MUIO_Label,label,MUIO_Label_LeftAligned|MUIO_Label_DoubleFrame)
  139. #define CLabel(label)  MUI_MakeObject(MUIO_Label,label,MUIO_Label_Centered)
  140. #define CLabel1(label) MUI_MakeObject(MUIO_Label,label,MUIO_Label_Centered|MUIO_Label_SingleFrame)
  141. #define CLabel2(label) MUI_MakeObject(MUIO_Label,label,MUIO_Label_Centered|MUIO_Label_DoubleFrame)
  142.  
  143. #define FreeLabel(label)   MUI_MakeObject(MUIO_Label,label,MUIO_Label_FreeVert)
  144. #define FreeLabel1(label)  MUI_MakeObject(MUIO_Label,label,MUIO_Label_FreeVert|MUIO_Label_SingleFrame)
  145. #define FreeLabel2(label)  MUI_MakeObject(MUIO_Label,label,MUIO_Label_FreeVert|MUIO_Label_DoubleFrame)
  146. #define FreeLLabel(label)  MUI_MakeObject(MUIO_Label,label,MUIO_Label_FreeVert|MUIO_Label_LeftAligned)
  147. #define FreeLLabel1(label) MUI_MakeObject(MUIO_Label,label,MUIO_Label_FreeVert|MUIO_Label_LeftAligned|MUIO_Label_SingleFrame)
  148. #define FreeLLabel2(label) MUI_MakeObject(MUIO_Label,label,MUIO_Label_FreeVert|MUIO_Label_LeftAligned|MUIO_Label_DoubleFrame)
  149. #define FreeCLabel(label)  MUI_MakeObject(MUIO_Label,label,MUIO_Label_FreeVert|MUIO_Label_Centered)
  150. #define FreeCLabel1(label) MUI_MakeObject(MUIO_Label,label,MUIO_Label_FreeVert|MUIO_Label_Centered|MUIO_Label_SingleFrame)
  151. #define FreeCLabel2(label) MUI_MakeObject(MUIO_Label,label,MUIO_Label_FreeVert|MUIO_Label_Centered|MUIO_Label_DoubleFrame)
  152.  
  153. #define KeyLabel(label,key)   MUI_MakeObject(MUIO_Label,label,key)
  154. #define KeyLabel1(label,key)  MUI_MakeObject(MUIO_Label,label,MUIO_Label_SingleFrame|(key))
  155. #define KeyLabel2(label,key)  MUI_MakeObject(MUIO_Label,label,MUIO_Label_DoubleFrame|(key))
  156. #define KeyLLabel(label,key)  MUI_MakeObject(MUIO_Label,label,MUIO_Label_LeftAligned|(key))
  157. #define KeyLLabel1(label,key) MUI_MakeObject(MUIO_Label,label,MUIO_Label_LeftAligned|MUIO_Label_SingleFrame|(key))
  158. #define KeyLLabel2(label,key) MUI_MakeObject(MUIO_Label,label,MUIO_Label_LeftAligned|MUIO_Label_DoubleFrame|(key))
  159. #define KeyCLabel(label,key)  MUI_MakeObject(MUIO_Label,label,MUIO_Label_Centered|(key))
  160. #define KeyCLabel1(label,key) MUI_MakeObject(MUIO_Label,label,MUIO_Label_Centered|MUIO_Label_SingleFrame|(key))
  161. #define KeyCLabel2(label,key) MUI_MakeObject(MUIO_Label,label,MUIO_Label_Centered|MUIO_Label_DoubleFrame|(key))
  162.  
  163. #define FreeKeyLabel(label,key)   MUI_MakeObject(MUIO_Label,label,MUIO_Label_FreeVert|(key))
  164. #define FreeKeyLabel1(label,key)  MUI_MakeObject(MUIO_Label,label,MUIO_Label_FreeVert|MUIO_Label_SingleFrame|(key))
  165. #define FreeKeyLabel2(label,key)  MUI_MakeObject(MUIO_Label,label,MUIO_Label_FreeVert|MUIO_Label_DoubleFrame|(key))
  166. #define FreeKeyLLabel(label,key)  MUI_MakeObject(MUIO_Label,label,MUIO_Label_FreeVert|MUIO_Label_LeftAligned|(key))
  167. #define FreeKeyLLabel1(label,key) MUI_MakeObject(MUIO_Label,label,MUIO_Label_FreeVert|MUIO_Label_LeftAligned|MUIO_Label_SingleFrame|(key))
  168. #define FreeKeyLLabel2(label,key) MUI_MakeObject(MUIO_Label,label,MUIO_Label_FreeVert|MUIO_Label_LeftAligned|MUIO_Label_DoubleFrame|(key))
  169. #define FreeKeyCLabel(label,key)  MUI_MakeObject(MUIO_Label,label,MUIO_Label_FreeVert|MUIO_Label_Centered|(key))
  170. #define FreeKeyCLabel1(label,key) MUI_MakeObject(MUIO_Label,label,MUIO_Label_FreeVert|MUIO_Label_Centered|MUIO_Label_SingleFrame|(key))
  171. #define FreeKeyCLabel2(label,key) MUI_MakeObject(MUIO_Label,label,MUIO_Label_FreeVert|MUIO_Label_Centered|MUIO_Label_DoubleFrame|(key))
  172.  
  173. #define NO_TAGS               ((Tag)TAG_DONE)
  174.  
  175. #endif                // MUIPP_NOSHORTCUTS
  176.  
  177. // All variable args methods must start with a StartVarArgs object
  178.  
  179. class StartVarArgs
  180. {
  181. public:
  182.     ULONG methodID;
  183. };
  184.  
  185. static StartVarArgs sva;    // Use this object at the start of variable
  186.                             // argument methods.
  187.  
  188. // When MUIPP_DEBUG is defined then checking is performed to ensure objects
  189. // create successfully, required tags are passed and indexes into lists aren't
  190. // out of range. Depending on the error found either an error or a warning
  191. // message will be generated and printed on stderr. If an error occurs then
  192. // the application is terminated but a warning will just print a message.
  193. // At present, errors can only occur if you use a template Listview or List
  194. // object (ie CTMUI_Listview or CTMUI_List classes) and supply an invalid index
  195. // to the [] operator.
  196.  
  197. #ifdef MUIPP_DEBUG
  198.  
  199. #ifdef __GNUC__
  200. #include <inline/exec.h>
  201. #include <inline/utility.h>
  202. #else
  203. #include <clib/exec_protos.h>
  204. #include <clib/utility_protos.h>
  205. #endif
  206.  
  207. #include <stdio.h>
  208.  
  209. // This defines the maximum number of tags that are likely to be passed to an
  210. // object during creation. If TAG_DONE is not found within this number of tags
  211. // then an error message will be generated. The default is 30 but this can be
  212. // overridden by defining it to something else or this feature can be turned off
  213. // by defining it to be 0.
  214.  
  215. #ifndef MUIPP_DEBUG_NUMTAGS
  216. #define MUIPP_DEBUG_NUMTAGS 30
  217. #endif
  218.  
  219. static void
  220. _MUIPPWarning (const char *message, ...)
  221. {
  222.     fprintf (stderr, "MUIPP Warning: ");
  223.     vfprintf (stderr, message, (_VA_LIST_)(&message + 1));
  224. }
  225.  
  226. static void
  227. _MUIPPError (const char *message, ...)
  228. {
  229.     fprintf (stderr, "MUIPP Error: ");
  230.     vfprintf (stderr, message, (_VA_LIST_)(&message + 1));
  231.  
  232.     fprintf (stderr, "Do you wish to quit your application (q) or continue (c)?");
  233.     fflush (stderr);
  234.     char response[10];
  235.     fscanf (stderr, "%s", response);
  236.  
  237.     if (response[0] == 'q' || response[0] == 'Q')
  238.         exit (10);
  239. }
  240.  
  241. static void
  242. _CheckTagsSpecifiedA (const char *className,
  243.                       struct TagItem *tags,
  244.                       struct TagItem *requiredTags)
  245. {
  246.     struct TagItem *tag, *tstate;
  247.     int i;
  248.  
  249.     // Make sure utility.library has been opened first
  250.  
  251.     if (UtilityBase == NULL)
  252.     {
  253.          if ((UtilityBase = (struct UtilityBase *)OpenLibrary ("utility.library", 0)) == NULL)
  254.          {
  255.               _MUIPPWarning ("Could not open utility.library for debugging purposes:\n"
  256.                              "Cannot check correct tags specified or for missing TAG_DONE\n");
  257.               return;
  258.          }
  259.     }
  260.  
  261.     // Check for possible missing TAG_DONE
  262.  
  263.     if (MUIPP_DEBUG_NUMTAGS != 0)
  264.     {
  265.         for (tstate = tags, i = 0; (tag = NextTagItem(&tstate)) != NULL && i < MUIPP_DEBUG_NUMTAGS;)
  266.             ;
  267.  
  268.         if (i == MUIPP_DEBUG_NUMTAGS)
  269.             _MUIPPError ("Possible missing TAG_DONE during construction of a %s object\n", className);
  270.     }
  271.  
  272.     // Check all required tags are passed
  273.  
  274.     for (tstate = requiredTags; (tag = NextTagItem(&tstate)) != NULL;)
  275.     {
  276.  
  277.         if (FindTagItem (tag->ti_Tag, tags) == NULL)
  278.             _MUIPPWarning ("When constructing %s objects the %s attribute should be specified\n",
  279.                            className,
  280.                            (const char *)tag->ti_Data);
  281.     }
  282. }
  283.  
  284. static void
  285. _CheckTagsSpecified (const char *className,
  286.                      struct TagItem *tags,
  287.                      Tag tag1, ...)
  288. {
  289.     _CheckTagsSpecifiedA (className, tags, (struct TagItem *)&tag1);
  290. }
  291.  
  292. #endif      /* MUIPP_DEBUG */
  293.  
  294.  
  295. /***************************************************************************
  296. **
  297. **                       CMUI_Object class definition
  298. **
  299. **      This is the root object that all MUI C++ classes inherit from
  300. **
  301. ***************************************************************************/
  302.  
  303. class CMUI_Object
  304. {
  305. public:
  306.  
  307.     CMUI_Object (void)
  308.     {
  309.         object = NULL;
  310.     }
  311.  
  312.     // If you wish to check if the object was created successfully then
  313.     // call this.
  314.  
  315.     BOOL IsValid (void) const
  316.     {
  317.         return (object != NULL);
  318.     }
  319.  
  320.     // Methods to get and set attributes by tag ID. You can use these
  321.     // in derived classes to get and set attributes, instead of having
  322.     // to call the intuition.library/GetAttr() and SetAttrs() functions.
  323.  
  324.     // Get value of attribute and place value in supplied value address.
  325.  
  326.     ULONG GetAttr (Tag attr, ULONG *value) const
  327.     {
  328.          return ::GetAttr (attr, object, value);
  329.     }
  330.  
  331.     // Get and return value of attribute
  332.  
  333.     ULONG GetAttr (Tag attr) const
  334.     {
  335.          ULONG value;
  336.          GetAttr (attr, &value);
  337.          return value;
  338.     }
  339.  
  340.     void SetAttr (Tag attr, ULONG value)
  341.     {
  342.         SetAttrs (object, attr, value, TAG_DONE);
  343.     }
  344.  
  345.     // Call a method on this object specified by the supplied method id
  346.     // and parameters.
  347.  
  348.     ULONG DoMethod (ULONG methodID, ...)
  349.     {
  350.          return ::DoMethodA (object, (Msg)&methodID);
  351.     }
  352.  
  353.     ULONG DoMethodA (Msg msg)
  354.     {
  355.         return ::DoMethodA (object, msg);
  356.     }
  357.  
  358.     // This can be called to dispose of an object
  359.     // Note: this should only be called for objects that are allocated
  360.     // dynamically and are not disposed when the application object gets
  361.     // disposed. If debugging is turned on then a warning message will
  362.     // be printed if you try to do this and the object won't be disposed.
  363.  
  364.     void Dispose (void)
  365.     {
  366. #ifdef MUIPP_DEBUG
  367.         if ((Object *)GetAttr (MUIA_Parent) != NULL)
  368.         {
  369.             _MUIPPWarning ("Tried to dispose an object that has a parent object:\n"
  370.                            "Object not disposed\n");
  371.             return;
  372.         }
  373. #endif
  374.         MUI_DisposeObject (object);
  375.         object = NULL;
  376.     }
  377.  
  378.     // Coersion to BOOPSI objects and to Tags
  379.  
  380.     operator Object * () const
  381.     {
  382.         return object;
  383.     }
  384.  
  385.     operator Tag () const
  386.     {
  387.         return (Tag)object;
  388.     }
  389.  
  390.     // Dynamically adding and removing objects
  391.  
  392.     void AddMember (Object *child)
  393.     {
  394.         DoMethod (OM_ADDMEMBER, child);
  395.     }
  396.  
  397.     void RemMember (Object *child)
  398.     {
  399.         DoMethod (OM_REMMEMBER, child);
  400.     }
  401.  
  402. protected:
  403.     Object *object;       // Pointer to MUI BOOPSI based object
  404. };
  405.